RESURF - solution to nurb surface fittingr Computer Aided Design (CAD)

    Home | Products | Purchase | Change log & Road map | Gallery |   Support | Download |  Contact |  中文

Home > ResurfNurbs 文档

目录

1. 介绍

下载并安装ResurfNurbs库函数
下载库函数调用示范代码工程包

许可协议

2. 指令列表

Fill Hole by NURBS接口说明

 

3. 教程

下载库函数调用示范代码工程包

4. 问题和回答

FAQ 1

 

ResurfNurbs 库函数补充孔洞功能模块 API 说明


1. ResurfNurbs 库函数补充孔洞功能简介

针对某些几何存在孔洞或残缺的现象,ResurfNurbs库函数提供了用NURBS曲面补充孔洞残缺的功能。NURBS曲面填充孔洞之后,在孔洞边界线处达到G1连续。ResurfNurbs库函数提供了G0/G1连续的数值报告。

如下图1是一个存在孔洞的几何模型:

(图1)

图2拾取蓝色的孔洞边界线作为生成NURBS曲面的输入参数 :

(图2)

图3生成了一张 裁剪NRUBS曲面填充孔洞:

 

(图3)

图4是孔洞NURBS与相邻的NURBS曲面在公共边界线上的G1连续性偏差报告

(图4)

ResurfNurbs库函数既可以生成裁剪曲面填充孔洞,又可以生成非裁剪的四边曲面填充孔洞。具体用那种类型的曲面填充孔洞,用户可以根据孔洞边界的形态做出选择。

2. API 调用的形式

调用 API 必须按照以下形式严格执行:

Step 1: 初始化 。调用 RsFillHoleByNurbs_Start() 初始化;

Step 2: 输入边界线 。调用 RsFillHoleByNurbs_AppendBoundaryCurve() 增加一条 3D 曲线或者调用 RsFillHoleByNurbs_AppendSurfaceEdge() 增加一条曲面边界线。 这些边界线必须围成一个闭环,它们的端点与端点之间的首尾相接距离不要太大。

Step 3: 参数设置 。调用 RsFillHoleByNurbs_SetSmoothFactor() 设置曲面光滑度。

Step 4: 参数设置 。调用 RsFillHoleByNurbs_SetDrapSurfaceType() 设置曲面的形态类型 ;

Step 5: 生成曲面 。调用 RsFillHoleByNurbs_DoFill() 执行曲面生成;

Step 6: 获取生成的曲面数据 。调用 RsFillHoleByNurbs_GetNurbs() 获取生成的一张 NURBS 曲面;

Step 7: 如果生成的是裁剪曲面,获取裁剪边界曲线的数据 。调用 RsFillHoleByNurbs_Get2DTrimmingCurveCount() 获取裁剪环上边界曲线的数目;调用 RsFillHoleByNurbs_Get2DTrimmingCurve() 获取第 i 条 2D 裁剪边界线的数据;调用 RsFillHoleByNurbs_Get3DTrimmingCurve() 获取第 i 条 3D 裁剪边界线的数据;

Step 8: 获取新曲面边界线上的连续性报告。调用 RsFillHoleByNurbs_GetMaxG1ReportData(double** point_x, double** point_y, double** point_z, double** angles, int* point_num); RsFillHoleByNurbs_GetG1ReportData(double** point_x, double** point_y, double** point_z, double** angles, int* point_num); RsFillHoleByNurbs_GetMaxG0ReportData(double** point_x, double** point_y, double** point_z, double** deviation, int* point_num);RsFillHoleByNurbs_GetG0ReportData(double** point_x, double** point_y, double** point_z, double** deviation, int* point_num); 等函数查看边界线上的G0/G1连续性;

Step9 : 结束调用 。 RsFillHoleByNurbs_End() 。

 

3.API 参数说明

 

DECLDIR void RsFillHoleByNurbs_Start();

功能:初始化功能。该接口为必须最先调用的函数。

参数:该接口没有参数。

 

DECLDIR void RsFillHoleByNurbs_AppendBoundaryCurve(double* cpx, double* cpy, double* cpz, double* weight, int ctrlp_num, int is_rational, int degree, double* knot);

功能:增加一条 3D NURBS 曲线作为边界线。 3D NURBS 曲线是指不在曲面上的空间曲线。

输入参数说明

int ctrlp_num : 曲线的控制点数目;

int is_rational: 该曲线是否为有理 NURBS 曲线。 0 代表非有理 B 样条曲线 ; 1 代表有理 NURBS 曲线;

int degree :曲线的次数 ; 必须满足不等式 ctrlp_num>=(degree+1); 当 ctrlp_num==(degree+1) 时,该曲线为 Bezier 曲线;

double* knot :曲线的节点向量。长度为 ctrlp_num+degree+1;

double* cpx : 存储曲线控制顶点的 x 坐标 , 长度为 ctrlp_num;

double* cpy: 存储曲线控制顶点的 y 坐标 , 长度为 ctrlp_num;

double* cpz: 存储曲线控制顶点的 z 坐标 , 长度为 ctrlp_num;

double* weight: 存储曲线控制顶点的权值 , 长度为 ctrlp_num; 如果该曲线为非有理 B 样条曲线,则 weight 可以为空;

(绿色为3D 曲线)

DECLDIR void RsFillHoleByNurbs_AppendSurfaceEdge(double* cpu, double* cpv, double* curve_weight, int ctrlp_num, int is_curve_rational, int degree, double* knot,int iso_type, int continuity, int hasface, double* surf_cpx, double* surf_cpy, double* surf_cpz, double* surf_weight, int u_num, int v_num,

int is_surf_rational, int u_degree, int v_degree, double* u_knot, double* v_knot);

功能:增加一条曲面边界曲线 (surface edge) 作为边界线。曲面边界曲线 (surface edge) 是指落在曲面上的曲线,这条曲线由一条曲面的 2D 参数空间上的二维曲线定义。

输入参数说明

参数包含两个部分内容: NURBS 曲面数据和曲面边界曲线的数据。

NURBS 曲面数据

int u_num : 曲面在 U 方向的控制点数目;

int v_num: 曲面在 V 方向的控制点数目;

int u_degree: 曲面在 U 方向的次数;

int v_degree: 曲面在 V 方向的次数;

int is_surf_rational: 曲面是否为有理 NURBS 曲面。 0 代表非有理 B 样条曲面 ; 1 代表有理 NURBS 曲面;

double* u_knot: 曲面在 U 方向的节点向量,长度为 u_num+u_degree+1

double* v_knot: 曲面在 V 方向的节点向量,长度为 v_num+v_degree+1

double* surf_cpx: 曲面控制点的 x 分量坐标,长度为 u_num*v_num ,沿 v 方向排列;

double* surf_cpy: 曲面控制点的 y 分量坐标,长度为 u_num*v_num ,沿 v 方向排列;

double* surf_cpz: 曲面控制点的 z 分量坐标,长度为 u_num*v_num ,沿 v 方向排列;

double* surf_weight: 曲面控制点上的权值,长度为 u_num*v_num ,沿 v 方向排列;如果该曲面是非有理 B 样条曲面 , 该值可以为空 ;

曲面边界曲线的数据 :

int ctrlp_num : 曲线的控制点数目;

int is_curve_rational: 该曲线是否为有理 NURBS 曲线。 0 代表非有理 B 样条曲线 ; 1 代表有理 NURBS 曲线;

int degree :曲线的次数 ; 必须满足不等式 ctrlp_num>=(degree+1); 当 ctrlp_num==(degree+1) 时,该曲线为 Bezier 曲线;

double* knot :曲线的节点向量。长度为 ctrlp_num+degree+1;

double* cpu : 存储曲线控制顶点的 u 向坐标 , 长度为 ctrlp_num;

double* cpv: 存储曲线控制顶点的 v 向坐标 , 长度为 ctrlp_num;

double* curve_weight: 存储曲线控制顶点的权值 , 长度为 ctrlp_num; 如果该曲线为非有理 B 样条曲线,则 curve_weight 可以为空;

int iso_type: 该曲线是否为等参数线:

-1 : 曲线是 3d 没有曲面信息;

0 :非等参线;

1: x_iso;

2: y_iso;

3: west_iso; u=u向起始点

4: south_iso; v=v向起始点

5: east_iso; u=u向终止点

6: north_iso; v=v向终止点

int continuity: 新曲面在该曲线上的连续性 , 0: G0; 1: G1

int hasface: 该值总是为 1

(蓝色为曲面曲线(surface edge))

DECLDIR void RsFillHoleByNurbs_SetSmoothFactor(double factor);

功能:控制新曲面的光滑性。

输入参数说明

double factor : [0.0001,1.0] 之间取值,越大曲面越光滑;

 

DECLDIR void RsFillHoleByNurbs_SetDrapSurfaceType(int type);

功能:设置曲面的拉伸形态,根据拉伸形态值,设置曲面是否为裁剪曲面

输入参数说明

int type: 0 --- 自动计算拉伸, 生成裁剪曲面

1 ---- 沿 x 轴方向拉伸,生成裁剪曲面

2 ---- 沿 y 轴方向拉伸,生成裁剪曲面

3 ---- 沿 z 轴方向拉伸,生成裁剪曲面

(蓝色曲线内为用裁剪曲面填充孔洞)

4 ---- 固定四条边界线拉伸,生成非裁剪曲面 . 程序自动计算 4 个角点。

(蓝色曲线内为用非裁剪曲面填充孔洞)

5 ---- 固定四条边界线拉伸,生成第一类孔斯 (coons) 非裁剪曲面 . 程序自动计算 4 个角点。

 

DECLDIR void RsFillHoleByNurbs_DoFill();

功能:执行曲面生成。

 

 

DECLDIR bool RsFillHoleByNurbs_GetNurbs(int* u_num, int* v_num, int* u_degree, int* v_degree, double** u_knot, double** v_knot, double** cpx, double** cpy, double** cpz);

功能:获取新 NURBS 曲面的数据。

输出参数说明

int *u_num : 曲面在 U 方向的控制点数目;

int *v_num: 曲面在 V 方向的控制点数目;

int *u_degree: 曲面在 U 方向的次数;

int *v_degree: 曲面在 V 方向的次数;

double** u_knot: 曲面在 U 方向的节点向量,长度为 u_num+u_degree+1

double** v_knot: 曲面在 V 方向的节点向量,长度为 v_num+v_degree+1

double** cpx: 曲面控制点的 x 分量坐标,长度为 u_num*v_num ,沿 v 方向排列;

double** cpy: 曲面控制点的 y 分量坐标,长度为 u_num*v_num ,沿 v 方向排列;

double** cpz: 曲面控制点的 z 分量坐标,长度为 u_num*v_num ,沿 v 方向排列;

 

 

DECLDIR int RsFillHoleByNurbs_Get2DTrimmingCurveCount();

功能:返回新裁剪曲面由多少条边界线。如果新曲面是非裁剪曲面,这个数目就是 0. 如果是裁剪曲面,则这些边界曲线组成一个边界环。每根边界曲线可以取到参数域上 2D 曲线和物理曲面位置上的 3D 曲线 .

 

DECLDIR void RsFillHoleByNurbs_Get2DTrimmingCurve(int index, int* ctrlp_num, int* degree, double** knot, double** cpu, double** cpv);

功能:给定 index ,取出边界环上的第 index 条 2D 曲线数据。

输出参数

曲面边界曲线的数据 :

int index: 曲线在边界环上的 id 号 ;

int *ctrlp_num : 曲线的控制点数目 ;

int *degree :曲线的次数 ;

double** knot :曲线的节点向量。长度为 ctrlp_num+degree+1;

double** cpu : 存储曲线控制顶点的 u 向坐标 , 长度为 ctrlp_num;

double** cpv: 存储曲线控制顶点的 v 向坐标 , 长度为 ctrlp_num;

 

 

DECLDIR void RsFillHoleByNurbs_Get3DTrimmingCurve(int index, int* ctrlp_num, int* degree, double** knot, double** cpx, double** cpy, double** cpz);

功能:给定 index ,取出边界环上的第 index 条 3D 曲线数据。

输出参数

曲面边界曲线的数据 :

int index: 曲线在边界环上的 id 号 ;

int *ctrlp_num : 曲线的控制点数目 ;

int *degree :曲线的次数 ;

double** knot :曲线的节点向量。长度为 ctrlp_num+degree+1;

double** cpx : 存储曲线控制顶点的 x 分量坐标 , 长度为 ctrlp_num;

double** cpy: 存储曲线控制顶点的 y 分量坐标 , 长度为 ctrlp_num;

double** cpz: 存储曲线控制顶点的 z 分量坐标 , 长度为 ctrlp_num;

 

DECLDIR void RsFillHoleByNurbs_End();

功能:结束曲面生成。

 

DECLDIR void RsFillHoleByNurbs_Clear();

功能:清除所有数据,重置。

 

DECLDIR bool RsFillHoleByNurbs_GetStatus();

功能:查看是否成功生成曲面。

返回值: true :成功生成了NURBS曲面; false :没有生成曲面

 

DECLDIR void RsFillHoleByNurbs_GetMaxG1ReportData(double** point_x, double** point_y, double** point_z, double** angles, int* point_num);

功能:在成功生成曲面的状态下报告每段边界线上的最大G1连续偏差角度。如果边界线是曲面曲线,则存在G1连续的角度偏差值;如果边界线是3D曲线,则不存在G1连续角度偏差值。

输出参数:

double** point_x : 边界线上最大G1连续角度偏差值所在点的x坐标分量,该数组大小为 *point_num;

double** point_y: 边界线上最大G1连续角度偏差值所在点的y坐标分量,该数组大小为 *point_num;

double** point_z:边界线上最大G1连续角度偏差值所在点的z坐标分量,该数组大小为 *point_num;

double** angles: 边界线上最大G1连续角度偏差值所在点的G1连续偏差角度大小值,该值为角度值.该数组大小为 *point_num;

int* point_num:能度量G1连续的边界线的数目;

 

DECLDIR void RsFillHoleByNurbs_GetG1ReportData(double** point_x, double** point_y, double** point_z, double** angles, int* point_num);

功能:在成功生成曲面的状态下报告出曲面边界线上一批离散点的最大G1连续偏差角度。如果输入边界线是曲面曲线,则存在G1连续的角度偏差值;如果输入边界线是3D曲线,则不存在G1连续角度偏差值。

输出参数:

double** point_x : 边界线上G1连续角度偏差值所在点的x坐标分量,该数组大小为 *point_num;

double** point_y: 边界线上G1连续角度偏差值所在点的y坐标分量,该数组大小为 *point_num;

double** point_z:边界线上G1连续角度偏差值所在点的z坐标分量,该数组大小为 *point_num;

double** angles: 边界线上G1连续角度偏差值所在点的G1连续偏差角度大小值,该值为角度值.该数组大小为 *point_num;

int* point_num:边界线上离散点的个数;

 

 

DECLDIR void RsFillHoleByNurbs_GetMaxG0ReportData(double** point_x, double** point_y, double** point_z, double** deviation, int* point_num);

功能:在成功生成曲面的状态下报告每段边界线上的最大G0连续距离偏差. 曲面的每条边界线,不管是曲面曲线,还是3D曲线,存在G0连续距离偏差值。

输出参数:

double** point_x : 边界线上最大G0连续距离偏差值所在点的x坐标分量,该数组大小为 *point_num;

double** point_y: 边界线上最大G0连续距离偏差值所在点的y坐标分量,该数组大小为 *point_num;

double** point_z:边界线上最大G0连续距离偏差值所在点的z坐标分量,该数组大小为 *point_num;

double** deviation: 边界线上最大G0连续距离偏差值所在点的G0连续偏差距离大小值.该数组大小为 *point_num;

int* point_num:能度量G0连续的边界线的数目;

DECLDIR void RsFillHoleByNurbs_GetG0ReportData(double** point_x, double** point_y, double** point_z, double** deviation, int* point_num);

功能:在成功生成曲面的状态下报告边界线上一批离散点的G0连续距离偏差. 曲面的每条边界线,不管是曲面曲线,还是3D曲线,存在G0连续距离偏差值。

输出参数:

double** point_x : 边界线上G0连续距离偏差值所在点的x坐标分量,该数组大小为 *point_num;

double** point_y: 边界线上G0连续距离偏差值所在点的y坐标分量,该数组大小为 *point_num;

double** point_z:边界线上G0连续距离偏差值所在点的z坐标分量,该数组大小为 *point_num;

double** deviation: 边界线上G0连续距离偏差值所在点的G0连续偏差距离大小值.该数组大小为 *point_num;

int* point_num:该批离散点的个数;

 

 

 

 

 

 

 

 

 

Copyright (C) 2007-2025 RESURF All Rights Reserved. Privacy Statement